package br.unisul.redeNeural;

/**
 * Classe para verificar a saida de uma {@link RedeNeural} apos o treino.<br>
 * Após o treino é possivel testar a {@link RedeNeural} com essa classe atraves do metodo verificarSaidas
 * onde é passada como parametro os valores dos neuronios da camada de entrada e o metodo retornara o valor 
 * que foi obtida na camada de saida.  
 * @author Joelson
 *
 */
public class DefaultVerificarSaida implements VerificarSaida, java.io.Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 2406560956843448790L;
	/**
	 * Rede Neural já treinada
	 */
	private RedeNeural redeNeural;
	
	/**
	 * Construtor 
	 * @param redeNeural - rede neural que será utilizada para verificar a saida
	 */
	public DefaultVerificarSaida(RedeNeural redeNeural) {
		super();
		this.redeNeural = redeNeural;
	}


	/**
	 * metodo para verificar as saidas apos o treino
	 * @param entradas - valores dos neuronios da camada de entrada
	 * @return valores obtido nos neuronios de saidas
	 * @throws RedeNeuralException 
	 */
	public double[] verificarSaidas(double[] entradas) throws RedeNeuralException{
		redeNeural.atualizarEntradas(entradas);
		for (int i = 1; i < redeNeural.quantidadeCamadas(); i++) {
			Neuronio[] neuronios = redeNeural.getNeuronios(i);
			for (int j = 0; j < neuronios.length; j++) {
				double d = redeNeural.calcularSaidaNeuronio(redeNeural.getNeuroniosEntrada(i, j),
						redeNeural.getPesosEntrada(i, j), neuronios[j]);
				neuronios[j].setValorNeuronio(redeNeural.aplicarFuncaoAtivacao(d));
			}
		}
		Neuronio n[] = redeNeural.getSaidas();
		double d[] = new double[n.length];
		for (int i = 0; i < d.length; i++) {
			d[i] = n[i].getValorNeuronio();
		}
		return d;
	}


	/**
	 * @return the redeNeural
	 */
	public RedeNeural getRedeNeural() {
		return redeNeural;
	}


	/**
	 * @param redeNeural the redeNeural to set
	 */
	public void setRedeNeural(RedeNeural redeNeural) {
		this.redeNeural = redeNeural;
	}
	
	
}
